package com.warmheart.core.util;

import java.beans.PropertyEditorSupport;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang3.StringUtils;

/**
 * 
 * 类描述：时间操作定义类
 * 
 */
public class DateUtils extends PropertyEditorSupport {

    /**
     * @update andy SimpleDateFormat 是线程不安全的类 一般不要定义为static
     *         如果定义为static必须加锁，或作如下处理:
     */
    private static final ThreadLocal<SimpleDateFormat> date_sdf = ThreadLocal.withInitial(() -> new SimpleDateFormat(
            "yyyy-MM-dd"));

    public static final ThreadLocal<SimpleDateFormat> yyyyMMdd = ThreadLocal.withInitial(() -> new SimpleDateFormat(
            "yyyyMMdd"));

    public static final ThreadLocal<SimpleDateFormat> date_sdf_wz = ThreadLocal.withInitial(() -> new SimpleDateFormat(
            "yyyy年MM月dd日"));

    public static final ThreadLocal<SimpleDateFormat> teme_dsf = ThreadLocal.withInitial(() -> new SimpleDateFormat(
            "yyyy-MM-dd HH:mm"));

    public static final ThreadLocal<SimpleDateFormat> yyyymmddhhmmss = ThreadLocal
            .withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmss"));

    public static final ThreadLocal<SimpleDateFormat> short_time_sdf = ThreadLocal
            .withInitial(() -> new SimpleDateFormat("HH:mm"));

    public static final ThreadLocal<SimpleDateFormat> datetimeFormat = ThreadLocal
            .withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    // 各种时间格式
    // public static final SimpleDateFormat date_sdf = new
    // SimpleDateFormat("yyyy-MM-dd");

    // 各种时间格式
    // public static final SimpleDateFormat yyyyMMdd = new
    // SimpleDateFormat("yyyyMMdd");

    // 各种时间格式
    // public static final SimpleDateFormat date_sdf_wz = new
    // SimpleDateFormat("yyyy年MM月dd日");
    //
    // public static final SimpleDateFormat teme_dsf.get() = new
    // SimpleDateFormat("yyyy-MM-dd HH:mm");
    //
    // public static final SimpleDateFormat yyyymmddhhmmss = new
    // SimpleDateFormat("yyyyMMddHHmmss");
    //
    // public static final SimpleDateFormat short_time_sdf.get() = new
    // SimpleDateFormat("HH:mm");
    //
    // public static final SimpleDateFormat datetimeFormat = new
    // SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    // 以毫秒表示的时间
    public static final long DAY_IN_MILLIS = 24 * 3600 * 1000;

    public static final long HOUR_IN_MILLIS = 3600 * 1000;

    public static final long MINUTE_IN_MILLIS = 60 * 1000;

    public static final long SECOND_IN_MILLIS = 1000;

    // 指定模式的时间格式
    private static ThreadLocal<SimpleDateFormat> getSDFormat(String pattern) {
        return ThreadLocal.withInitial(() -> new SimpleDateFormat(pattern));
    }

    /**
     * 当前日历，这里用中国时间表示
     * 
     * @return 以当地时区表示的系统当前日历
     */
    public static Calendar getCalendar() {
        return Calendar.getInstance();
    }

    /**
     * 指定毫秒数表示的日历
     * 
     * @param millis
     *            毫秒数
     * @return 指定毫秒数表示的日历
     */
    public static Calendar getCalendar(long millis) {
        Calendar cal = Calendar.getInstance();
        // --------------------cal.setTimeInMillis(millis);
        cal.setTime(new Date(millis));
        return cal;
    }

    // ////////////////////////////////////////////////////////////////////////////
    // getDate
    // 各种方式获取的Date
    // ////////////////////////////////////////////////////////////////////////////

    /**
     * 当前日期
     * 
     * @return 系统当前时间
     */
    public static Date getDate() {
        return new Date();
    }

    /**
     * 指定毫秒数表示的日期
     * 
     * @param millis
     *            毫秒数
     * @return 指定毫秒数表示的日期
     */
    public static Date getDate(long millis) {
        return new Date(millis);
    }

    /**
     * 字符串转换时间戳
     * 
     * @param str
     * @return
     */
    public static Timestamp str2Timestamp(String str) {
        Date date = str2Date(str, date_sdf.get());
        return new Timestamp(date.getTime());
    }

    /**
     * 字符串转换成日期
     * 
     * @param str
     * @param sdf
     * @return
     */
    public static Date str2Date(String str, SimpleDateFormat sdf) {
        if (null == str || "".equals(str)) {
            return null;
        }
        Date date;
        if (sdf == null) {
            sdf = datetimeFormat.get();
        }
        try {
            date = sdf.parse(str);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 日期转换为字符串
     * 
     * @param date_sdf
     *            日期格式
     * @return 字符串
     */
    public static String date2Str(SimpleDateFormat date_sdf) {
        Date date = getDate();
        if (null == date) {
            return null;
        }
        return date_sdf.format(date);
    }

    /**
     * 格式化时间
     * 
     * @param date
     * @param format
     * @return
     */
    public static String dateformat(String date, String format) {
        SimpleDateFormat sformat = new SimpleDateFormat(format);
        Date _date = null;
        try {
            _date = sformat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return sformat.format(_date);
    }

    /**
     * 日期转换为字符串
     * 
     * @param date
     *            日期
     * @param date_sdf
     *            日期格式
     * @return 字符串
     */
    public static String date2Str(Date date, SimpleDateFormat date_sdf) {
        if (null == date) {
            return null;
        }
        return date_sdf.format(date);
    }

    /**
     * 日期转换为字符串
     * 
     * @param format
     *            日期格式
     * @return 字符串
     */
    public static String getDate(String format) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 指定毫秒数的时间戳
     * 
     * @param millis
     *            毫秒数
     * @return 指定毫秒数的时间戳
     */
    public static Timestamp getTimestamp(long millis) {
        return new Timestamp(millis);
    }

    /**
     * 以字符形式表示的时间戳
     * 
     * @param time
     *            毫秒数
     * @return 以字符形式表示的时间戳
     */
    public static Timestamp getTimestamp(String time) {
        return new Timestamp(Long.parseLong(time));
    }

    /**
     * 系统当前的时间戳
     * 
     * @return 系统当前的时间戳
     */
    public static Timestamp getTimestamp() {
        return new Timestamp(System.currentTimeMillis());
    }

    /**
     * 指定日期的时间戳
     * 
     * @param date
     *            指定日期
     * @return 指定日期的时间戳
     */
    public static Timestamp getTimestamp(Date date) {
        return new Timestamp(date.getTime());
    }

    /**
     * 指定日历的时间戳
     * 
     * @param cal
     *            指定日历
     * @return 指定日历的时间戳
     */
    public static Timestamp getCalendarTimestamp(Calendar cal) {
        // ---------------------return new Timestamp(cal.getTimeInMillis());
        return new Timestamp(cal.getTime().getTime());
    }

    public static Timestamp gettimestamp() {
        Date dt = new Date();
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowTime = df.format(dt);
        Timestamp buydate = Timestamp.valueOf(nowTime);
        return buydate;
    }

    public static String getFormateDate() {
        Date dt = new Date();
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        String nowTime = df.format(dt);
        return nowTime;
    }

    // ////////////////////////////////////////////////////////////////////////////
    // getMillis
    // 各种方式获取的Millis
    // ////////////////////////////////////////////////////////////////////////////

    /**
     * 系统时间的毫秒数
     * 
     * @return 系统时间的毫秒数
     */
    public static long getMillis() {
        return System.currentTimeMillis();
    }

    /**
     * 指定日历的毫秒数
     * 
     * @param cal
     *            指定日历
     * @return 指定日历的毫秒数
     */
    public static long getMillis(Calendar cal) {
        // --------------------return cal.getTimeInMillis();
        return cal.getTime().getTime();
    }

    /**
     * 指定日期的毫秒数
     * 
     * @param date
     *            指定日期
     * @return 指定日期的毫秒数
     */
    public static long getMillis(Date date) {
        return date.getTime();
    }

    /**
     * 指定时间戳的毫秒数
     * 
     * @param ts
     *            指定时间戳
     * @return 指定时间戳的毫秒数
     */
    public static long getMillis(Timestamp ts) {
        return ts.getTime();
    }

    // ////////////////////////////////////////////////////////////////////////////
    // formatDate
    // 将日期按照一定的格式转化为字符串
    // ////////////////////////////////////////////////////////////////////////////

    /**
     * 默认方式表示的系统当前日期，具体格式：年-月-日
     * 
     * @return 默认日期按“年-月-日“格式显示
     */
    public static String formatDate() {
        return date_sdf.get().format(getCalendar().getTime());
    }

    /**
     * 
     * @Title: getWeekOfDate
     * @Description: 获取周几
     * @param date
     * @return
     */
    public static String getWeekOfDate(Date date) {
        String[] weekDays = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return weekDays[w];
    }

    /**
     * 获取时间字符串
     */
    public static String getDataString(SimpleDateFormat formatstr) {
        return formatstr.format(getCalendar().getTime());
    }

    /**
     * 指定日期的默认显示，具体格式：年-月-日
     * 
     * @param cal
     *            指定的日期
     * @return 指定日期按“年-月-日“格式显示
     */
    public static String formatDate(Calendar cal) {
        return date_sdf.get().format(cal.getTime());
    }

    /**
     * 指定日期的默认显示，具体格式：年-月-日
     * 
     * @param date
     *            指定的日期
     * @return 指定日期按“年-月-日“格式显示
     */
    public static String formatDate(Date date) {
        return date_sdf.get().format(date);
    }

    /**
     * 指定毫秒数表示日期的默认显示，具体格式：年-月-日
     * 
     * @param millis
     *            指定的毫秒数
     * @return 指定毫秒数表示日期按“年-月-日“格式显示
     */
    public static String formatDate(long millis) {
        return date_sdf.get().format(new Date(millis));
    }

    /**
     * 默认日期按指定格式显示
     * 
     * @param pattern
     *            指定的格式
     * @return 默认日期按指定格式显示
     */
    public static String formatDate(String pattern) {
        return getSDFormat(pattern).get().format(getCalendar().getTime());
    }

    /**
     * 指定日期按指定格式显示
     * 
     * @param cal
     *            指定的日期
     * @param pattern
     *            指定的格式
     * @return 指定日期按指定格式显示
     */
    public static String formatDate(Calendar cal, String pattern) {
        return getSDFormat(pattern).get().format(cal.getTime());
    }

    /**
     * 指定日期按指定格式显示
     * 
     * @param date
     *            指定的日期
     * @param pattern
     *            指定的格式
     * @return 指定日期按指定格式显示
     */
    public static String formatDate(Date date, String pattern) {
        return getSDFormat(pattern).get().format(date);
    }

    // ////////////////////////////////////////////////////////////////////////////
    // formatTime
    // 将日期按照一定的格式转化为字符串
    // ////////////////////////////////////////////////////////////////////////////

    /**
     * 默认方式表示的系统当前日期，具体格式：年-月-日 时：分
     * 
     * @return 默认日期按“年-月-日 时：分“格式显示
     */
    public static String formatTime() {
        return teme_dsf.get().format(getCalendar().getTime());
    }

    /**
     * 指定毫秒数表示日期的默认显示，具体格式：年-月-日 时：分
     * 
     * @param millis
     *            指定的毫秒数
     * @return 指定毫秒数表示日期按“年-月-日 时：分“格式显示
     */
    public static String formatTime(long millis) {
        return teme_dsf.get().format(new Date(millis));
    }

    /**
     * 指定日期的默认显示，具体格式：年-月-日 时：分
     * 
     * @param cal
     *            指定的日期
     * @return 指定日期按“年-月-日 时：分“格式显示
     */
    public static String formatTime(Calendar cal) {
        return teme_dsf.get().format(cal.getTime());
    }

    /**
     * 指定日期的默认显示，具体格式：年-月-日 时：分
     * 
     * @param date
     *            指定的日期
     * @return 指定日期按“年-月-日 时：分“格式显示
     */
    public static String formatTime(Date date) {
        return teme_dsf.get().format(date);
    }

    // ////////////////////////////////////////////////////////////////////////////
    // formatShortTime
    // 将日期按照一定的格式转化为字符串
    // ////////////////////////////////////////////////////////////////////////////

    /**
     * 默认方式表示的系统当前日期，具体格式：时：分
     * 
     * @return 默认日期按“时：分“格式显示
     */
    public static String formatShortTime() {
        return short_time_sdf.get().format(getCalendar().getTime());
    }

    /**
     * 指定毫秒数表示日期的默认显示，具体格式：时：分
     * 
     * @param millis
     *            指定的毫秒数
     * @return 指定毫秒数表示日期按“时：分“格式显示
     */
    public static String formatShortTime(long millis) {
        return short_time_sdf.get().format(new Date(millis));
    }

    /**
     * 指定日期的默认显示，具体格式：时：分
     * 
     * @param cal
     *            指定的日期
     * @return 指定日期按“时：分“格式显示
     */
    public static String formatShortTime(Calendar cal) {
        return short_time_sdf.get().format(cal.getTime());
    }

    /**
     * 指定日期的默认显示，具体格式：时：分
     * 
     * @param date
     *            指定的日期
     * @return 指定日期按“时：分“格式显示
     */
    public static String formatShortTime(Date date) {
        return short_time_sdf.get().format(date);
    }

    // ////////////////////////////////////////////////////////////////////////////
    // parseDate
    // parseCalendar
    // parseTimestamp
    // 将字符串按照一定的格式转化为日期或时间
    // ////////////////////////////////////////////////////////////////////////////

    /**
     * 根据指定的格式将字符串转换成Date 如输入：2003-11-19 11:20:20将按照这个转成时间
     * 
     * @param src
     *            将要转换的原始字符窜
     * @param pattern
     *            转换的匹配格式
     * @return 如果转换成功则返回转换后的日期
     * @throws ParseException
     */
    public static Date parseDate(String src, String pattern) throws ParseException {
        return getSDFormat(pattern).get().parse(src);

    }

    /**
     * 根据指定的格式将字符串转换成Date 如输入：2003-11-19 11:20:20将按照这个转成时间
     * 
     * @param src
     *            将要转换的原始字符窜
     * @param pattern
     *            转换的匹配格式
     * @return 如果转换成功则返回转换后的日期
     * @throws ParseException
     */
    public static Calendar parseCalendar(String src, String pattern) throws ParseException {

        Date date = parseDate(src, pattern);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal;
    }

    public static String formatAddDate(String src, String pattern, int amount) throws ParseException {
        Calendar cal;
        cal = parseCalendar(src, pattern);
        cal.add(Calendar.DATE, amount);
        return formatDate(cal);
    }

    /**
     * 根据指定的格式将字符串转换成Date 如输入：2003-11-19 11:20:20将按照这个转成时间
     * 
     * @param src
     *            将要转换的原始字符窜
     * @param pattern
     *            转换的匹配格式
     * @return 如果转换成功则返回转换后的时间戳
     * @throws ParseException
     */
    public static Timestamp parseTimestamp(String src, String pattern) throws ParseException {
        Date date = parseDate(src, pattern);
        return new Timestamp(date.getTime());
    }

    // ////////////////////////////////////////////////////////////////////////////
    // dateDiff
    // 计算两个日期之间的差值
    // ////////////////////////////////////////////////////////////////////////////

    /**
     * 计算两个时间之间的差值，根据标志的不同而不同
     * 
     * @param flag
     *            计算标志，表示按照年/月/日/时/分/秒等计算
     * @param calSrc
     *            减数
     * @param calDes
     *            被减数
     * @return 两个日期之间的差值
     */
    public static int dateDiff(char flag, Calendar calSrc, Calendar calDes) {

        long millisDiff = getMillis(calSrc) - getMillis(calDes);

        if (flag == 'y') {
            return (calSrc.get(Calendar.YEAR) - calDes.get(Calendar.YEAR));
        }

        if (flag == 'd') {
            return (int) (millisDiff / DAY_IN_MILLIS);
        }

        if (flag == 'h') {
            return (int) (millisDiff / HOUR_IN_MILLIS);
        }

        if (flag == 'm') {
            return (int) (millisDiff / MINUTE_IN_MILLIS);
        }

        if (flag == 's') {
            return (int) (millisDiff / SECOND_IN_MILLIS);
        }

        return 0;
    }

    /**
     * 
     * @Title: dateDiffFormat
     * @Description: 两个日期之间的差值
     * @author ZhangJianyang
     * @param dateSrc
     * @param dateDes
     * @return
     */
    public static String dateDiffFormat(Date dateSrc, Date dateDes) {
        String resultStr = null;
        long millisDiff = dateSrc.getTime() - dateDes.getTime();
        int dayCnt = (int) (millisDiff / DAY_IN_MILLIS);
        int dayMod = (int) (millisDiff % DAY_IN_MILLIS);
        int hourCnt = (int) (dayMod / HOUR_IN_MILLIS);
        int hourMod = (int) (dayMod % HOUR_IN_MILLIS);
        int minuteCnt = (int) (hourMod / MINUTE_IN_MILLIS);
        int minuteMod = (int) (hourMod % MINUTE_IN_MILLIS);
        int secondCnt = (int) (minuteMod / SECOND_IN_MILLIS);
        if (dayCnt > 0) {
            resultStr = dayCnt + "天";
        }
        if (!StringUtils.isBlank(resultStr)) {
            resultStr = resultStr + hourCnt + "小时";
        } else {
            if (hourCnt > 0) {
                resultStr = hourCnt + "小时";
            }
        }

        if (!StringUtils.isBlank(resultStr)) {
            resultStr = resultStr + minuteCnt + "分";
        } else {
            if (minuteCnt > 0) {
                resultStr = minuteCnt + "分";
            }
        }

        if (!StringUtils.isBlank(resultStr)) {
            resultStr = resultStr + secondCnt + "秒";
        } else {
            if (secondCnt > 0) {
                resultStr = secondCnt + "秒";
            }
        }

        if (StringUtils.isBlank(resultStr)) {
            resultStr = "0秒";
        }

        return resultStr;
    }

    /**
     * String类型 转换为Date, 如果参数长度为10 转换格式”yyyy-MM-dd“ 如果参数长度为19 转换格式”yyyy-MM-dd
     * HH:mm:ss“ * @param text String类型的时间值
     */
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.isNotBlank(text)) {
            try {
                if (text.indexOf(":") == -1 && text.length() == 10) {
                    setValue(date_sdf.get().parse(text));
                } else if (text.indexOf(":") > 0 && text.length() == 19) {
                    setValue(datetimeFormat.get().parse(text));
                } else {
                    throw new IllegalArgumentException("Could not parse date, date format is error ");
                }
            } catch (ParseException ex) {
                IllegalArgumentException iae = new IllegalArgumentException("Could not parse date: " + ex.getMessage());
                iae.initCause(ex);
                throw iae;
            }
        } else {
            setValue(null);
        }
    }

    public static int getYear() {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(getDate());
        return calendar.get(Calendar.YEAR);
    }

    public static String getFormattedDateUtil(Date dtDate, String strFormatTo) {
        if (dtDate == null) {
            return "";
        }
        strFormatTo = strFormatTo.replace('/', '-');
        try {
            SimpleDateFormat formatter = new SimpleDateFormat(strFormatTo);
            return formatter.format(dtDate);
        } catch (Exception e) {
            e.getMessage();
            return "";
        }
    }

    /**
     * 当前时间+num个月的时间
     * 
     * @return
     */
    public static Date monthAdd(int num) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, num);
        return cal.getTime();
    }

    /**
     * 传入时间+num个月的时间
     * 
     * @Title: monthAdd
     * @param isDate
     * @param num
     * @return
     */
    public static Date monthAdd(Date isDate, int num) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(isDate);
        cal.add(Calendar.MONTH, num);
        return cal.getTime();
    }

    /**
     * 当前时间+num天的时间
     * 
     * @return
     */
    public static Date dayAdd(int num) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, num);
        return cal.getTime();
    }

    /**
     * 传入时间+num天的时间
     * 
     * @Title: dayAdd
     * @param isDate
     * @param num
     * @return
     */
    public static Date dayAdd(Date isDate, int num) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(isDate);
        cal.add(Calendar.DATE, num);
        return cal.getTime();
    }

    /**
     * 当前时间+num小时的时间
     * 
     * @return
     */
    public static Date hourAdd(int num) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR_OF_DAY, num);
        return cal.getTime();
    }

    /**
     * 传入时间+num小时的时间
     * 
     * @Title: hourAdd
     * @param isDate
     * @param num
     * @return
     */
    public static Date hourAdd(Date isDate, int num) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(isDate);
        cal.add(Calendar.HOUR_OF_DAY, num);
        return cal.getTime();
    }

    /**
     * 当前时间+num分钟的时间
     * 
     * @return
     */
    public static Date minAdd(int num) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, num);
        return cal.getTime();
    }

    /**
     * 传入时间+num分钟的时间
     * 
     * @Title: dayAdd
     * @param isDate
     * @param num
     * @return
     */
    public static Date minAdd(Date isDate, int num) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(isDate);
        cal.add(Calendar.MINUTE, num);
        return cal.getTime();
    }

    /**
     * 获取日期，范围在（1-28）
     */
    public static int getDay() {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(getDate());
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return (day > 28) ? 28 : day;
    }

    /* 计算间隔几个月的日期 */
    public static String dateMonth(Date date, Integer month) {
        String reStr = "";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar rightNow = Calendar.getInstance();
        rightNow.setTime(date);
        rightNow.add(Calendar.MONTH, month);
        Date dt1 = rightNow.getTime();
        reStr = sdf.format(dt1);
        return reStr;
    }

    /**
     * 日期格式转换date TO 2017-04-18T17:44:02+08:00
     * 
     * @throws ParseException
     */
    public static String ZrbotDateFormat(Date date) throws ParseException {
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
        return sd.format(date);
    }

    /**
     * 判断两个日期是否相同，忽略时分秒 相同返回true,反之false
     * 
     * @param d1
     * @param d2
     * @return
     */
    public static boolean sameDate(Date d1, Date d2) {
        SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
        return fmt.format(d1).equals(fmt.format(d2));
    }

    /**
     * 计算两个日期相差天数 不包括时分秒
     * 
     * @param maxD
     * @param minD
     * @return
     * @throws ParseException
     */
    public static long divDiff(Date maxD, Date minD) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        maxD = sdf.parse(sdf.format(maxD));
        minD = sdf.parse(sdf.format(minD));
        Calendar cal = Calendar.getInstance();
        cal.setTime(maxD);
        long time1 = cal.getTimeInMillis();
        cal.setTime(minD);
        long time2 = cal.getTimeInMillis();
        long between_days = (time1 - time2) / (1000 * 3600 * 24);

        return Integer.parseInt(String.valueOf(between_days));
    }

    // 两个时间比较大小 小于返回-1 等于返回0 大于返回1
    public static int compareTo(Date date, Date anotherDate) {
        long thisTime = date.getTime();
        long anotherTime = anotherDate.getTime();
        return (thisTime < anotherTime ? -1 : (thisTime == anotherTime ? 0 : 1));
    }

    public static String getWeekOfDate(Calendar c) {
        String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
        int w = c.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return weekDays[w];
    }

    public static void main(String[] args) throws ParseException {
        // int days = DateUtils.betweenDays("2017-4-23");
        // System.out.println(days);

        // System.out.println(dateMonth(new Date(), 4));
        // System.out.println(ZrbotDateFormat(new Date()));
        // Date pasttime = teme_dsf.get().parse("2017-07-01 12:21");
        // System.out.println(DateUtils.betweenDays(pasttime));
        // System.out.println(DateUtils.dayAdd(pasttime, 30));

        // System.out.println(DateUtils.parseDate("2017-07-01 12:23:23",
        // "HH:mm:ss"));

        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime ldt = LocalDateTime.parse("2018-06-01 10:12:05", df);
        ldt.toString();
        System.out.println(ldt.toString());
        /*
         * Calendar calDes = Calendar.getInstance();
         * calDes.setTime(DateUtils.parseDate("2017-07-01 12:23:23",
         * "HH:mm:ss")); int minDiff = DateUtils.dateDiff('m',
         * DateUtils.getCalendar(), calDes); System.out.println(minDiff);
         */
    }
}